package br.com.gip.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import org.richfaces.component.html.HtmlDataTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.gip.business.ArtefatoBusiness;
import br.com.gip.business.CategoriaBusiness;
import br.com.gip.business.HistoricoArtefatoBusiness;
import br.com.gip.business.ProjetoBusiness;
import br.com.gip.business.RelacionamentoBusiness;
import br.com.gip.exception.BusinessException;
import br.com.gip.repository.model.Artefato;
import br.com.gip.repository.model.Categoria;
import br.com.gip.repository.model.HistoricoArtefato;
import br.com.gip.repository.model.Projeto;

@Scope("session")
@Controller("artefatoController")
public class ArtefatoController implements Serializable {

	private static final long serialVersionUID = -2829362681330334211L;

	@Autowired
	private ArtefatoBusiness artefatoBusiness;
	
	@Autowired
	private CategoriaBusiness categoriaBusiness;

	@Autowired
	private ProjetoBusiness projetoBusiness;
	
	@Autowired
	private HistoricoArtefatoBusiness historicoArtefatoBusiness;
	
	@Autowired
	private RelacionamentoBusiness relacionamentoBusiness;
	
	@Autowired
	private LoginController loginContoller;
	
	private Artefato artefato;
	
	private Artefato artefatoTemp;
	
	private List<Artefato> artefatos;
	
	private List<HistoricoArtefato> historicoArtefatos;
	
	private List<Artefato> dependentes;
	
	private HtmlDataTable dataTable;
	
	private Boolean naoExibirCadastrar;

	private Boolean naoExibirAlterar;
	
	private String descricaoAlteracao;
	
	private String message;
	
	public String cadastro() {
		this.message = "";
		this.artefato = new Artefato();
		this.artefatos = new ArrayList<Artefato>();
		this.naoExibirCadastrar = Boolean.FALSE;
		this.naoExibirAlterar = Boolean.TRUE;
		this.message = "";
		return "cadastro-artefato";
	}
	
	public String cadastrarArtefato() {
		this.artefato.setOwner(this.loginContoller.getUsuario());
		
		if (naoExibirAlterar) {
			Date date = new Date();
			this.artefato.setDataCriacao(date);
		} else {
			/* verifica restricao de dependentes */
			if (this.artefato.isRestrito()) {
				if (this.artefatoBusiness.verificaRestricao(this.artefato)) {
					this.message = "Artefato possui relacionamento com outro projeto, o nivel de restricao nao pode ser abaixado";
					return "cadastrar-artefato-erro";
				}
			}
			
			HistoricoArtefato historicoArtefato  = new HistoricoArtefato();

			this.historicoArtefatos = this.historicoArtefatoBusiness.bucarHistoricoArtefato(this.artefato.getArtefatoId());
			
			if (historicoArtefatos.size() == 3) {
				historicoArtefato = this.historicoArtefatos.remove(0);
				this.historicoArtefatoBusiness.removerHistoricoArtefato(historicoArtefato);
			}
			
			this.artefatoTemp.setArtefatoId(this.artefato.getArtefatoId());
			
			historicoArtefato.setArtefato(this.artefatoTemp);
			historicoArtefato.setCategoria(this.artefatoTemp.getCategoria());
			historicoArtefato.setOwner(this.artefatoTemp.getOwner());
			historicoArtefato.setProjeto(this.artefatoTemp.getProjeto());
			historicoArtefato.setDataAlteracao(new Date());
			historicoArtefato.setNome(this.artefatoTemp.getNome());
			historicoArtefato.setRestrito(this.artefatoTemp.isRestrito());
			historicoArtefato.setDescricao(this.descricaoAlteracao);
			
			this.artefatoTemp = new Artefato();
			historicoArtefatoBusiness.cadastrarHistoricoArtefato(historicoArtefato);
		}
		
		try {
			this.artefatoBusiness.cadastrarArtefato(this.artefato);	
		} catch (BusinessException e) {
			this.message = e.getMessage();
			return "cadastrar-artefato-erro";
		}
		
		this.artefato = new Artefato();
		this.artefatos = this.artefatoBusiness.buscarArtefatos(null, null, null);
		
		this.message = "Artefato salvo com sucesso";
		
		if (!this.naoExibirAlterar) {
			return "editar-artefato-sucesso";
		} else {
			return "cadastrar-artefato-sucesso";
		}
	}	
	
	public String lista() {
		this.message = "";
		this.artefato = new Artefato();
		this.artefatos = new ArrayList<Artefato>();
		return "lista-artefato";
	}
	
	public String consultarArtefatos() {
		this.message = "";
		this.artefatos = this.artefatoBusiness.buscarArtefatos(this.artefato.getNome(), this.artefato.getProjeto().getProjetoId(), this.artefato.getCategoria().getCategoriaId());
		return "lista-artefatos";
	}
	
	public String removerArtefato() {
		this.message = "";
		this.artefatoBusiness.removerArtefato(this.artefato);
		this.artefatos = this.artefatoBusiness.buscarArtefatos(null, null, null);
		this.artefato = new Artefato();
		return "delete-artefato-sucesso";
	}
		
	public void consultaDependencias() {
		this.message = "";
		this.artefato = new Artefato();
		this.artefato = (Artefato) this.dataTable.getRowData();
		this.dependentes = this.relacionamentoBusiness.buscarDependencias((Artefato) this.dataTable.getRowData());
	}
	
	public String editar() {
		this.message = "";
		this.artefato = (Artefato) this.dataTable.getRowData();

		this.artefatoTemp = new Artefato();
		this.artefatoTemp.setNome(this.artefato.getNome());
		this.artefatoTemp.setCategoria(this.artefato.getCategoria());
		this.artefatoTemp.setOwner(this.artefato.getOwner());
		this.artefatoTemp.setProjeto(this.artefato.getProjeto());
		this.artefatoTemp.setRestrito(this.artefato.isRestrito());
		this.artefatoTemp.setDataCriacao(this.artefato.getDataCriacao());
		
		this.historicoArtefatos = new ArrayList<HistoricoArtefato>();
		
		this.descricaoAlteracao = "";
		this.naoExibirCadastrar = Boolean.TRUE;
		this.naoExibirAlterar = Boolean.FALSE;
		this.message = "";
		
		return "editar-artefato";
	}
	
	public SelectItem[] getAllCategorias() {
		List<SelectItem> itens = new ArrayList<SelectItem>();
		
		itens.add(new SelectItem("", "Selecione"));
		for (Categoria categoria : this.categoriaBusiness.buscarCategorias()) {
			itens.add(new SelectItem(categoria.getCategoriaId(), categoria.getNome()));
		}

		return itens.toArray(new SelectItem[itens.size()]);
	}

	public SelectItem[] getAllProjetos() {
		List<SelectItem> itens = new ArrayList<SelectItem>();
		
		itens.add(new SelectItem("", "Selecione"));
		for (Projeto projetos : this.projetoBusiness.buscarProjetos()) {
			itens.add(new SelectItem(projetos.getProjetoId(), projetos.getNome()));
		}

		return itens.toArray(new SelectItem[itens.size()]);
	}

	public ArtefatoBusiness getArtefatoBusiness() {
		return artefatoBusiness;
	}

	public void setArtefatoBusiness(ArtefatoBusiness artefatoBusiness) {
		this.artefatoBusiness = artefatoBusiness;
	}

	public CategoriaBusiness getCategoriaBusiness() {
		return categoriaBusiness;
	}

	public void setCategoriaBusiness(CategoriaBusiness categoriaBusiness) {
		this.categoriaBusiness = categoriaBusiness;
	}

	public Artefato getArtefato() {
		return artefato;
	}

	public void setArtefato(Artefato artefato) {
		this.artefato = artefato;
	}

	public ProjetoBusiness getProjetoBusiness() {
		return projetoBusiness;
	}

	public void setProjetoBusiness(ProjetoBusiness projetoBusiness) {
		this.projetoBusiness = projetoBusiness;
	}

	public List<Artefato> getArtefatos() {
		return artefatos;
	}

	public void setArtefatos(List<Artefato> artefatos) {
		this.artefatos = artefatos;
	}
	
	public HtmlDataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(HtmlDataTable dataTable) {
		this.dataTable = dataTable;
	}

	public List<Artefato> getDependentes() {
		return dependentes;
	}

	public void setDependentes(List<Artefato> dependentes) {
		this.dependentes = dependentes;
	}

	public RelacionamentoBusiness getRelacionamentoBusiness() {
		return relacionamentoBusiness;
	}

	public void setRelacionamentoBusiness(
			RelacionamentoBusiness relacionamentoBusiness) {
		this.relacionamentoBusiness = relacionamentoBusiness;
	}

	public LoginController getLoginContoller() {
		return loginContoller;
	}

	public void setLoginContoller(LoginController loginContoller) {
		this.loginContoller = loginContoller;
	}

	public Boolean getNaoExibirCadastrar() {
		return naoExibirCadastrar;
	}

	public void setNaoExibirCadastrar(Boolean naoExibirCadastrar) {
		this.naoExibirCadastrar = naoExibirCadastrar;
	}

	public Boolean getNaoExibirAlterar() {
		return naoExibirAlterar;
	}

	public void setNaoExibirAlterar(Boolean naoExibirAlterar) {
		this.naoExibirAlterar = naoExibirAlterar;
	}

	public HistoricoArtefatoBusiness getHistoricoArtefatoBusiness() {
		return historicoArtefatoBusiness;
	}

	public void setHistoricoArtefatoBusiness(
			HistoricoArtefatoBusiness historicoArtefatoBusiness) {
		this.historicoArtefatoBusiness = historicoArtefatoBusiness;
	}

	public List<HistoricoArtefato> getHistoricoArtefatos() {
		return historicoArtefatos;
	}

	public void setHistoricoArtefatos(List<HistoricoArtefato> historicoArtefatos) {
		this.historicoArtefatos = historicoArtefatos;
	}

	public String getDescricaoAlteracao() {
		return descricaoAlteracao;
	}

	public void setDescricaoAlteracao(String descricaoAlteracao) {
		this.descricaoAlteracao = descricaoAlteracao;
	}

	public Artefato getArtefatotemp() {
		return artefatoTemp;
	}

	public void setArtefatotemp(Artefato artefatotemp) {
		this.artefatoTemp = artefatotemp;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}
